package com.yuxi.util;

import java.util.concurrent.ExecutionException;

import com.squareup.okhttp.Response;
import com.yuxi.config.MyHyStrixCommand;
import com.yuxi.properties.HyStrixProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.netflix.hystrix.HystrixCommand.Setter;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties;

/**
 * HystrixUtil  工具类
 */
@Component
public class HystrixUtil {

    /****
     *
     *HystrixCommandGroupKey：这个的名称设置为一个被调用的服务，
     * eg.hotelService，所有这个服务下的方法都用同一个线程池（前提是没有配置ThreadPoolKey）
     * HystrixCommandKey：这个名称通常是被调用服务的一个方法的名字（实际上就是被调用服务某一个controller中的一个对外方法），
     * eg.getHotelInfo()
     *ThreadPoolKey：这个用的很少，除非一个被调用服务中的有些被调用方法快、有的被调用方法慢，这样的话，
     * 就需要分别使用一个ThreadPoolKey，为每一个方法单独分配线程池
     */

    @Autowired
    private HyStrixProperties hp;

    /**
     *
     * @param serviceName  接口名
     * @param methodName 方法名
     * @param url
     * @return
     * @throws InterruptedException
     * @throws ExecutionException
     */
    public Response execute(String serviceName,
                            String methodName,
                            String url) throws InterruptedException, ExecutionException {
        Setter setter = Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(serviceName));//被调用服务
        setter.andCommandKey(HystrixCommandKey.Factory.asKey(methodName));//被调用服务的一个被调用方法
        setter.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                .withExecutionTimeoutInMilliseconds(hp.getTimeoutInMillions()));
        return new MyHyStrixCommand(setter, url).execute();//同步执行
//        Future<Response> future = new MyHystrixCommand(setter, url).queue();//异步执行
//        return future.get();//需要时获取
    }

}